package cn.tedu._06interceptor.config;

import cn.tedu._06interceptor.interceptors.MyInterceptor1;
import cn.tedu._06interceptor.interceptors.MyInterceptor2;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    // implements WebMvcConfigurer 实现标准化配置接口
    // addI tab补齐 对添加拦截器方法进行重写
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器对象[将自己写的拦截器类对象作为参数填入]
        // 策略1[默认的,未指明拦截对象]:拦截所有请求
        //registry.addInterceptor(new MyInterceptor1());

        // 策略2:拦截指定请求,比如拦截/users/login请求[拦截添加路径表达式]
        // 拦截少量请求时用逗号隔开路径表达式即可
        //registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/users/login","/users/reg");

        // 策略3:拦截指定模块的请求 比如拦截用户模块的所有请求
        // 使用拦截器中的通配符 `**` 不同路径之间用`,`隔开即可 若要规定具体功能 将路径补全或新写一个路径皆可
        //registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/users/**","/weibo/**");

        // 策略4:排除指定模块的部分请求,比如:拦截用户模块的所有请求 但是排除/users/login请求
        //registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/users/**").excludePathPatterns("/users/login");

        /*
            list1:[pre1    pre2    pre3]
            list2:[post1   post2   post3]
            list3:[after1  after2  after3]

            dataStructure 结构

            这些拦截器的方法会被分类储存在不同的集合中(如上) 第一个方法preHandle调用顺序为拦截器添加顺序
            即根据集合下标进行执行调用
            而postHandle afterCompletion方法的调用 是按照集合下标从大到小执行的 也就是从最后注册的
            拦截器开始向前遍历输出这些方法

            通过源码可知
            查看源码步骤[拦截器]
            1.IDEA 中按住 ctrl + n 出现搜索框
            2.输入 DispatcherServlet
            3.右上角下载源
            4.点击左侧品字型图标 Structure
            5.找到 DoDispatch() 方法
            6.从上到下查看此方法
            7.依次进入到 preHandle postHandle afterCompletion 中查看源码
         */
        registry.addInterceptor(new MyInterceptor1());
        registry.addInterceptor(new MyInterceptor2());
    }
}
